/*
 * Socket.h
 *
 *  Created on: 15/05/2011
 *      Author: dela
 */

#ifndef SOCKET_H_
#define SOCKET_H_

class Socket {
private:
	unsigned int sockfd;
	bool stop;

	/**
	 * Ejecuta el send hasta que se termine de enviar el size completo.
	 */
	int sendRepeat(unsigned int size, const char *data);

	/**
	 * Ejecuta el receive hasta que se termine de recibir el size completo.
	 */
	int receiveRepeat(unsigned int size, char *data);
public:
	/**
	 * Constructor para un socket a conectar.
	 * Luego se utiliza:
	 * connectSocket( char* ip, int port );
	 */
	Socket() : stop(false) {};

	/**
	 * Constructor para un socket de accept.
	 * Luego se utiliza:
	 * acceptConnection()
	 */
	Socket(int port);

	/**
	 * Constructor para un socket devuelto por un accept.
	 */
	Socket(unsigned int fd) : sockfd(fd), stop(false)  {};

	~Socket();

	unsigned int getfd() {return sockfd;};

	/**
	 * Shutdown del socket.
	 */
	void shutdownSocket();

	/**
	 * Acepta nuevas conexiones y devuelve el socketfd
	 */
	unsigned int acceptConnection();

	/**
	 * Conecta el socket
	 */
	int connectSocket( char* ip, int port );

	/**
	 * Envia la data siguiendo el protocolo.
	 * Primero envia un int con el size.
	 * Luego envía la data.
	 */
	int sendData(unsigned int size, const char *data);

	/**
	 * Recive data siguiendo el protocolo.
	 * Primero recive un int con el size.
	 * Luego recive la data.
	 *
	 * Hay que liberar data luego de untilizarla.
	 */
	int receiveData(char **data);
};

#endif /* SOCKET_H_ */
